/**
 * 
 */
package com.fanbai.score.common.Utils;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;


import com.fanbai.score.common.Utils.log.YD_Log;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;

public class BitmapUtil {

	private static final int width_Max = 320;
	private static final int height_Max = 240;
	private static final int size_Max = 100;// 最大限制的文件大小，单位kb

	/**
	 * 获取bitmap文件大小，单位是KB
	 * 
	 * @param bitmap
	 * @return
	 */
	@SuppressLint("NewApi")
	public static int getBitmapFileSize(Bitmap bitmap) {

		int size = 0;
		try {
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
				size = bitmap.getByteCount() / 1000;
			} else {
				size = bitmap.getRowBytes() * bitmap.getHeight() / 1000;
			}
		} catch (Exception err) {
			err.printStackTrace();
		}
		return size;
	}

	/**
	 * 启动图片裁剪界面
	 * 
	 * @param uriFrom
	 *            图片来源uri
	 * @param uriTo
	 *            裁剪后的图片uri
	 * @param requestCode
	 *            裁剪界面对应的请求code
	 * @param size
	 *            1：1宽高时，图片的尺寸(px)
	 */
	public static void cropImageUri(Context context, Uri uriFrom, Uri uriTo, int requestCode, int size) {
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uriFrom, "image/*");
		intent.putExtra("crop", "true");
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// intent.putExtra("outputX", size);
		// intent.putExtra("outputY", size);
		intent.putExtra("scale", true);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, uriTo);
		// intent.putExtra("return-data", false);
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
		intent.putExtra("noFaceDetection", true); // no face detection
		((Activity) context).startActivityForResult(intent, requestCode);
	}

	/**
	 * 压缩图片()，返回压缩后的图片绝对路径<br/>
	 * http://blog.csdn.net/luhuajcdd/article/details/8948261
	 * 
	 * @param path
	 */
	public static String compressPicture_Path(String path) {
		String result = compressPicture_Path(path, width_Max, height_Max);
		return result;
	}

	/**
	 * 压缩图片，返回压缩后的图片绝对路径<br/>
	 * 注意：会将小图片变大
	 * 
	 * http://blog.csdn.net/luhuajcdd/article/details/8948261
	 * 
	 * @param path
	 */
	public static String compressPicture_Path(String path, int width, int height) {

		try {
			// 1.拿到图片文件
			File f = new File(path);

			// 2 压缩图片
			Bitmap bm = compressPicture_Bitmap(path, width, height);

			// 3.将图片持续化 字节数组缓冲区中
			ByteArrayOutputStream baos = new ByteArrayOutputStream();

			bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);

			// 进行 压缩时存放目录
			// 如果文件夹不存在就创建文件夹
			File file = new File(OtherUtils.simpleDir);
			if (!file.exists()) {
				file.mkdirs();
			}
			File sfile = new File(OtherUtils.simpleDir, f.getName());
			// 如果文件存在，就将文件删除；
			if (sfile.exists()) {
				sfile.delete();
			}
			FileOutputStream fos = new FileOutputStream(sfile);

			// 4 对字节流大小进行判断
			int options = 100;

			// 如果大于100kb则再次压缩,
			while (baos.toByteArray().length / 1024 > size_Max) {
				// 清空baos
				baos.reset();
				// 这里压缩options%，把压缩后的数据存放到baos中
				bm.compress(Bitmap.CompressFormat.JPEG, options, baos);
				options -= 20;
			}
			// 5 从字节缓冲区写到文件中
			fos.write(baos.toByteArray());
			fos.close();
			baos.close();
			YD_Log.writeLog("压缩成功,路径" + OtherUtils.simpleDir + "/" + f.getName());
			return OtherUtils.simpleDir + "/" + f.getName();

		} catch (Exception e) {
			e.printStackTrace();
			YD_Log.i("压缩失败" + e.getMessage());
		}
		return null;

	}

	/**
	 * 根据路径获得图片并压缩返回bitmap<br/>
	 * 
	 * @param filePath
	 * @return
	 */
	public static Bitmap compressPicture_Bitmap(String filePath, int width, int height) {

		final BitmapFactory.Options options = new BitmapFactory.Options();
		// 如果将其设为true的话，在decode时将会返回null,通过此设置可以去查询一个bitmap的属性，比如bitmap的长与宽，而不占用内存大小

		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(filePath, options);

		// 根据宽高比设置 宽高的缩放的比例
		options.inSampleSize = calculateInSampleSize(options, width, height);
		// 如果将其设为true的话，在decode时将会返回null,通过此设置可以去查询一个bitmap的属性，比如bitmap的长与宽，而不占用内存大小
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeFile(filePath, options);
	}

	/**
	 * 压缩图片(),根据路径获得图片并压缩返回bitmap<br/>
	 * 
	 * @param filePath
	 * @return
	 */
	public static Bitmap compressPicture_Bitmap(String filePath) {

		final BitmapFactory.Options options = new BitmapFactory.Options();
		// 如果将其设为true的话，在decode时将会返回null,通过此设置可以去查询一个bitmap的属性，比如bitmap的长与宽，而不占用内存大小

		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(filePath, options);

		// 根据宽高比设置 宽高的缩放的比例
		options.inSampleSize = calculateInSampleSize(options, width_Max, height_Max);
		// 如果将其设为true的话，在decode时将会返回null,通过此设置可以去查询一个bitmap的属性，比如bitmap的长与宽，而不占用内存大小
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeFile(filePath, options);
	}

	/**
	 * 算法 计算的缩放值
	 * 
	 * @param options
	 * @param reqWidth
	 * @param reqHeight
	 * @return
	 */
	private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {

		final int height = options.outHeight;
		final int width = options.outWidth;
		// 选取最佳压缩比例
		int inSampleSize = 1;
		if (height > reqHeight || width > reqWidth) {
			final int heightRatio = Math.round((float) height / (float) reqHeight);
			final int widthRatio = Math.round((float) width / (float) reqWidth);
			inSampleSize = heightRatio > widthRatio ? heightRatio : widthRatio;
		}
		return inSampleSize;
	}

}
